Latviešu

Atklājiet mikro-priekšgala arhitektūru (micro-frontends) spēku ar JavaScript moduļu federāciju Webpack 5. Uzziniet, kā veidot mērogojamas, uzturamas un neatkarīgas tīmekļa lietotnes.

JavaScript moduļu federācija ar Webpack 5: Visaptveroša rokasgrāmata mikro-priekšgala arhitektūrām

Pastāvīgi mainīgajā tīmekļa izstrādes ainavā lielu un sarežģītu lietotņu veidošana var būt biedējošs uzdevums. Tradicionālās monolītās arhitektūras bieži noved pie pagarināta izstrādes laika, izvietošanas sastrēgumiem un grūtībām uzturēt koda kvalitāti. Mikro-priekšgala arhitektūras (Micro-frontends) ir parādījušās kā spēcīgs arhitektūras modelis, lai risinātu šos izaicinājumus, ļaujot komandām veidot un izvietot neatkarīgas lielākas tīmekļa lietotnes daļas. Viena no daudzsološākajām tehnoloģijām mikro-priekšgala arhitektūru ieviešanai ir JavaScript moduļu federācija, kas ieviesta Webpack 5.

Kas ir mikro-priekšgala arhitektūras (micro-frontends)?

Mikro-priekšgala arhitektūras ir arhitektūras stils, kurā priekšgala lietotne tiek sadalīta mazākās, neatkarīgās vienībās, kuras dažādas komandas var izstrādāt, testēt un izvietot autonomi. Katra mikro-priekšgala arhitektūra ir atbildīga par konkrētu biznesa domēnu vai funkciju, un tās tiek apvienotas izpildes laikā, lai izveidotu pilnīgu lietotāja saskarni.

Iedomājieties to kā uzņēmumu: tā vietā, lai būtu viena milzīga izstrādes komanda, jums ir vairākas mazākas komandas, kas koncentrējas uz konkrētām jomām. Katra komanda var strādāt neatkarīgi, ļaujot ātrāk veikt izstrādes ciklus un vieglāk uzturēt sistēmu. Apsveriet lielu e-komercijas platformu, piemēram, Amazon; dažādas komandas varētu pārvaldīt produktu katalogu, iepirkumu grozu, norēķinu procesu un lietotāja konta pārvaldību. Tās visas varētu būt neatkarīgas mikro-priekšgala arhitektūras.

Mikro-priekšgala arhitektūru priekšrocības:

Mikro-priekšgala arhitektūru izaicinājumi:

Kas ir JavaScript moduļu federācija?

JavaScript moduļu federācija ir Webpack 5 funkcija, kas ļauj koplietot kodu starp atsevišķi kompilētām JavaScript lietotnēm izpildes laikā. Tā ļauj eksponēt jūsu lietotnes daļas kā "moduļus", kurus var izmantot citas lietotnes, nepublicējot tos centrālā repozitorijā, piemēram, npm.

Uztveriet moduļu federāciju kā veidu, kā izveidot federētu lietotņu ekosistēmu, kur katra lietotne var piedāvāt savu funkcionalitāti un patērēt funkcionalitāti no citām lietotnēm. Tas novērš nepieciešamību pēc kompilēšanas laika atkarībām un ļauj veikt patiesi neatkarīgas izvietošanas.

Piemēram, dizaina sistēmas komanda var eksponēt lietotāja saskarnes komponentus kā moduļus, un dažādas lietotņu komandas var patērēt šos komponentus tieši no dizaina sistēmas lietotnes, neinstalējot tos kā npm pakotnes. Kad dizaina sistēmas komanda atjaunina komponentus, izmaiņas automātiski atspoguļojas visās patērējošajās lietotnēs.

Moduļu federācijas pamatjēdzieni:

Moduļu federācijas iestatīšana ar Webpack 5: Praktiska rokasgrāmata

Apskatīsim praktisku piemēru, kā iestatīt moduļu federāciju ar Webpack 5. Mēs izveidosim divas vienkāršas lietotnes: saimnieka (Host) lietotni un attālināto (Remote) lietotni. Attālinātā lietotne eksponēs komponentu, un saimnieka lietotne to patērēs.

1. Projekta iestatīšana

Izveidojiet divus atsevišķus direktorijus savām lietotnēm: `host` un `remote`.

```bash mkdir host remote cd host npm init -y npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev npm install react react-dom cd ../remote npm init -y npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev npm install react react-dom ```

2. Attālinātās lietotnes konfigurācija

Direktorijā `remote` izveidojiet šādus failus:

src/index.js:

```javascript import React from 'react'; import ReactDOM from 'react-dom/client'; import RemoteComponent from './RemoteComponent'; const App = () => (

Remote Application

); const root = ReactDOM.createRoot(document.getElementById('root')); root.render(); ```

src/RemoteComponent.jsx:

```javascript import React from 'react'; const RemoteComponent = () => (

This is a Remote Component!

Rendered from the Remote Application.

); export default RemoteComponent; ```

webpack.config.js:

```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); const path = require('path'); module.exports = { entry: './src/index', mode: 'development', devServer: { port: 3001, static: { directory: path.join(__dirname, 'dist'), }, }, output: { publicPath: 'auto', }, module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-react', '@babel/preset-env'], }, }, }, ], }, plugins: [ new ModuleFederationPlugin({ name: 'remote', filename: 'remoteEntry.js', exposes: { './RemoteComponent': './src/RemoteComponent', }, shared: { react: { singleton: true, eager: true }, 'react-dom': { singleton: true, eager: true }, }, }), new HtmlWebpackPlugin({ template: './public/index.html', }), ], resolve: { extensions: ['.js', '.jsx'], }, }; ```

Izveidojiet `public/index.html` ar pamata HTML struktūru. Svarīgs ir `

`

3. Saimnieka lietotnes konfigurācija

Direktorijā `host` izveidojiet šādus failus:

  • `src/index.js`: Lietotnes ieejas punkts.
  • `webpack.config.js`: Webpack konfigurācijas fails.

src/index.js:

```javascript import React, { Suspense } from 'react'; import ReactDOM from 'react-dom/client'; const RemoteComponent = React.lazy(() => import('remote/RemoteComponent')); const App = () => (

Host Application

Loading Remote Component...
}>
); const root = ReactDOM.createRoot(document.getElementById('root')); root.render(); ```

webpack.config.js:

```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); const path = require('path'); module.exports = { entry: './src/index', mode: 'development', devServer: { port: 3000, static: { directory: path.join(__dirname, 'dist'), }, }, output: { publicPath: 'auto', }, module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-react', '@babel/preset-env'], }, }, }, ], }, plugins: [ new ModuleFederationPlugin({ name: 'host', remotes: { remote: 'remote@http://localhost:3001/remoteEntry.js', }, shared: { react: { singleton: true, eager: true }, 'react-dom': { singleton: true, eager: true }, }, }), new HtmlWebpackPlugin({ template: './public/index.html', }), ], resolve: { extensions: ['.js', '.jsx'], }, }; ```

Izveidojiet `public/index.html` ar pamata HTML struktūru (līdzīgi kā attālinātajai lietotnei). Svarīgs ir `

`

4. Instalējiet Babel

Gan `host`, gan `remote` direktorijos instalējiet Babel atkarības:

```bash npm install --save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader ```

5. Palaidiet lietotnes

Gan `host`, gan `remote` direktorijos pievienojiet šādu skriptu failam `package.json`:

```json "scripts": { "start": "webpack serve" } ```

Tagad palaidiet abas lietotnes:

```bash cd remote npm start cd ../host npm start ```

Atveriet pārlūkprogrammu un dodieties uz `http://localhost:3000`. Jums vajadzētu redzēt saimnieka lietotni ar tajā renderētu attālināto komponentu.

Galveno konfigurācijas opciju skaidrojums:

Papildu moduļu federācijas tehnikas

Moduļu federācija piedāvā daudzas papildu funkcijas, kas var palīdzēt jums veidot vēl sarežģītākas mikro-priekšgala arhitektūras.

Dinamiskie attālinātie moduļi (Dynamic Remotes)

Tā vietā, lai cietkodētu attālināto lietotņu URL Webpack konfigurācijā, jūs varat tos ielādēt dinamiski izpildes laikā. Tas ļauj viegli atjaunināt attālināto lietotņu atrašanās vietu, nepārkompilējot saimnieka lietotni.

Piemēram, jūs varētu glabāt attālināto lietotņu URL konfigurācijas failā vai datu bāzē un ielādēt tos dinamiski, izmantojot JavaScript.

```javascript // In webpack.config.js remotes: { remote: `promise new Promise(resolve => { const urlParams = new URLSearchParams(window.location.search); const remoteUrl = urlParams.get('remote'); // Assume remoteUrl is something like 'http://localhost:3001/remoteEntry.js' const script = document.createElement('script'); script.src = remoteUrl; script.onload = () => { // the key of module federation is that the remote app is // available using the name in the remote resolve(window.remote); }; document.head.appendChild(script); })`, }, ```

Tagad jūs varat ielādēt saimnieka lietotni ar vaicājuma parametru `?remote=http://localhost:3001/remoteEntry.js`

Versiju koplietojamie moduļi

Moduļu federācija var automātiski apstrādāt koplietojamo moduļu versiju kontroli un dublikātu noņemšanu, lai nodrošinātu, ka tiek ielādēta tikai viena saderīga katra moduļa versija. Tas ir īpaši svarīgi, strādājot ar lielām un sarežģītām lietotnēm, kurām ir daudz atkarību.

Jūs varat norādīt katra koplietojamā moduļa versiju diapazonu Webpack konfigurācijā.

```javascript // In webpack.config.js shared: { react: { singleton: true, eager: true, requiredVersion: '^18.0.0' }, 'react-dom': { singleton: true, eager: true, requiredVersion: '^18.0.0' }, }, ```

Pielāgoti moduļu ielādētāji

Moduļu federācija ļauj definēt pielāgotus moduļu ielādētājus, kurus var izmantot, lai ielādētu moduļus no dažādiem avotiem vai dažādos formātos. Tas var būt noderīgi, lai ielādētu moduļus no CDN vai no pielāgota moduļu reģistra.

Stāvokļa koplietošana starp mikro-priekšgala arhitektūrām

Viens no mikro-priekšgala arhitektūru izaicinājumiem ir stāvokļa koplietošana starp dažādām mikro-priekšgala arhitektūrām. Ir vairākas pieejas, ko varat izmantot, lai risinātu šo izaicinājumu:

Labākās prakses mikro-priekšgala arhitektūru ieviešanai ar moduļu federāciju

Šeit ir dažas labākās prakses, kas jāpatur prātā, ieviešot mikro-priekšgala arhitektūras ar moduļu federāciju:

Reāli piemēri moduļu federācijas darbībā

Lai gan konkrēti gadījumu pētījumi bieži ir konfidenciāli, šeit ir daži vispārināti scenāriji, kuros moduļu federācija var būt neticami noderīga:

Noslēgums

JavaScript moduļu federācija Webpack 5 nodrošina spēcīgu un elastīgu veidu, kā veidot mikro-priekšgala arhitektūras. Tā ļauj koplietot kodu starp atsevišķi kompilētām JavaScript lietotnēm izpildes laikā, nodrošinot neatkarīgas izvietošanas, tehnoloģiju daudzveidību un uzlabotu komandas autonomiju. Ievērojot šajā rokasgrāmatā izklāstītās labākās prakses, jūs varat izmantot moduļu federāciju, lai veidotu mērogojamas, uzturamas un inovatīvas tīmekļa lietotnes.

Priekšgala izstrādes nākotne neapšaubāmi virzās uz modulārām un sadalītām arhitektūrām. Moduļu federācija nodrošina būtisku rīku šo moderno sistēmu veidošanai, ļaujot komandām radīt sarežģītas lietotnes ar lielāku ātrumu, elastību un noturību. Tehnoloģijai attīstoties, mēs varam sagaidīt vēl inovatīvākus lietošanas gadījumus un labākās prakses.